package com.sky.sky_server.task;

import java.time.LocalDateTime;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import com.sky.sky_pojo.entity.Orders;
import com.sky.sky_server.mapper.OrderMapper;
import lombok.extern.slf4j.Slf4j;

/**
 * 订单处理的自动（定时）任务类
 */
@Slf4j
@Component
public class OrderTask {

    @Autowired
    private OrderMapper orderMapper;

    // todo 我把这里的自动任务取消了，太烦人了
    
    // 每分钟执行一次,检查订单状态,如果订单超时未支付,则取消订单
    //@Scheduled(cron = "0 */1 * * * ?")
    
    public void checkAndCancelUnpaidTimeoutOrders() {
        log.info("开始检查订单状态, 取消超时未支付的订单");
        // 十五分钟前的时间
        LocalDateTime beforeTime = LocalDateTime.now().minusMinutes(15);
        // 查询所有未支付且下单时间超过十五分钟的订单
        List<Orders> orders = orderMapper.selectByStatusAndTime(Orders.OrderStatus.PENDING_PAYMENT.getCode(), beforeTime);
        if(orders != null && orders.size() > 0) {
            for(Orders order : orders) {
                log.info("取消未支付订单,订单号: {}", order.getNumber());
                Orders newOrder = new Orders();
                newOrder.setId(order.getId());
                newOrder.setStatus(Orders.OrderStatus.CANCELLED.getCode());
                orderMapper.updateById(newOrder);
            }
        }
    }

    // 每天凌晨一点检查上个工作日的派送中订单，并将其更改为已完成；
    // tag 可以在每个订单中添加一个字段，派送开始时间，这样可以具体跟踪订单更具体的设置时间，而不是使用工作日，避免跨日问题
    @Scheduled(cron = "0 0 1 * * ?")
    public void autoCompleteLastWorkdayDeliveringOrders(){
        log.info("开始检查派送中订单, 更改为已完成");
        // 获取一小时前的时间
        LocalDateTime beforeTime = LocalDateTime.now().minusHours(1);
        // 查询所有派送中的订单
        List<Orders> orders = orderMapper.selectByStatusAndTime(Orders.OrderStatus.DELIVERING.getCode(), beforeTime);
        if(orders != null && orders.size() > 0) {
            for(Orders order : orders) {
                Orders newOrder = new Orders();
                newOrder.setId(order.getId());
                newOrder.setStatus(Orders.OrderStatus.COMPLETED.getCode());
                orderMapper.updateById(newOrder);
            }
        }

    }

    /**
     * 用户下单和催单通知商家测试
     */
    // @Scheduled(cron = "0/10 * * * * ?")
    // public void cancelUnpaidOrders(){
    //     // 随机1 或 2
    //     Integer type = Math.random() > 0.5 ? 1 : 2;
    //     Map<String, Object> map = new HashMap<>();
    //     map.put("type", type); // 1 表示来单提醒，2表示客户催单
    //     map.put("orderId", 1);
    //     map.put("content", "订单号：" + "54846311164845");

    //     String json = JSON.toJSONString(map);
    //     log.info("向客户端发送支付成功消息：{}", json);
    //     webSocketServer.sendToAllClient(json);
    // }

}
